'use strict';

const { Service } = require('egg');
const ModelName = 'User'
class RouterService extends Service {
    /**
     * 根据分页和搜索条件获取
     * @param {Object} where 查询用户的条件
     * @param {Number} page 当前分页
     * @param {Number} pageSize 当前页每页多少条
     */
    async getPage(where, page, pageSize) {
        return this.ctx.model[ModelName].findAndCountAll({
            where,
            offset: pageSize * (page - 1),
            limit: pageSize,
            order:[
                // id 降序
                ['create_time','ASC']
            ],
        });
    }

    // 所有列表
    async allList(where) {
        return this.ctx.model[ModelName].findAll({
            where,
            order:[
                // id 降序
                ['create_time','ASC']
            ],
        });
    }
    async findOne(id) {
        return this.ctx.model[ModelName].findOne({
            where: {
                id,
            },
        });
    }

    /**
     * 创建
     * @param {*} data 角色信息
     */
    async create(data) {
        let where = {
            phone: data.phone,
            role: data.role,
        }
        if (data.role == 2) {
            where.company_name = data.company_name;
        }
        // 判断账号是否存在
        const user = await this.ctx.model[ModelName].findOne({
            where: { phone: data.phone, role: data.role },
        })
        if (user) throw new Error('账号已存在');
        const insert = await this.ctx.model[ModelName].create({
            ...data,
            nickname: data.nickname || data.phone.slice(0, 3) + '****' + data.phone.slice(-4),
        });
        return this.findOne(insert.id);
    }
    async login({ phone, password }) {
        console.log('----')
        // 根据账号查询用户是否存在
        let user = await this.ctx.model[ModelName].findOne({
            where: { phone, role: 1 },
        });
        if (user.status === 0) {
            throw new Error('账号已被禁用');
        }
        if (!user) {
            // 直接注册
            user = await this.create({ phone, password, role: 1 });
        } else {
            // 判断密码是否有误
            const isValid = user.password === password
            if (!isValid) {
                throw new Error('密码错误');
            }
        }
        user = user.dataValues;
        delete user.password;
        return user;
    }
    async companyLogin({ phone, password }) {
        // 根据账号查询用户是否存在
        let user = await this.ctx.model[ModelName].findOne({
            where: { phone, role: 2 },
        });
        if (!user) throw new Error('账号不存在');
        if (user.status === 0) {
            throw new Error('账号已被禁用');
        }
        if (user.audit === -1) {
            throw new Error('账号待审核');
        }
        if (user.audit === 0) {
            throw new Error('账号审核未通过');
        }
        // 判断密码是否有误
        const isValid = user.password === password
        if (!isValid) {
            throw new Error('密码错误');
        }
        user = user.dataValues;
        delete user.password;
        return user;
    }

    /**
     * 根据ID修改
     * @param {Number} id ID
     * @param {Object} data 要修改的信息
     */
    async update(id, data) {
        return await this.ctx.model[ModelName].update(data, { where: { id } });
    }

    /**
     * 根据id删除
     * @param {Number}
     */
    async deleteById(id) {
        return await this.ctx.model[ModelName].destroy({ where: { id } });
    }

    async sendCode({ phone, type }) {
      // 手机号查询用户是否存在
      const user = await this.ctx.model[ModelName].findOne({
          where: { phone },
      });
      if (!user) throw new Error('手机号未注册不存在');
      // 检查一下当前手机号和类型是否已经发送过验证码
      const isExist = await this.ctx.model.Code.findOne({
          where: {
              phone,
              type,
            // 当前时间是否小于过期时间
              expire_time: {
                  $gt: new Date(),
              },
          },
      });
      if (isExist) throw new Error('验证码已发送，请稍后再试');
      // 短信平台地址 http://sms.zh-ink.com/api/sms/send
      // 接口中涉及到2个固定入参：用户名（uid）、用户密码（userpwd），其中密码是32位md5加密（小写）。
      //  uid = "gfxz"，
      //  userpwd = "77b53dc6c9f7af52f67b3b24c6d988ae"
      /**
       * uid	必需	string	用户名
       * userpwd	必需	string	用户密码，32位MD5加密，小写
       * mobile	必需	string	手机号码，多个号码时，以英文逗号（,）隔开，不能重复；一次提交最多包含5000个有效号码。
       * message	必需	string	短信内容，包含签名内容，且签名必须以【】括起前置。例如：【测试信息】您的验证码：2342
       * ext	选填	string	扩展码，最多支持3位。（注：不是所有账户都支持扩展码，需跟我公司确认）
       * 出参说明（JSON格式）
       * mid		string	请求批次号（状态推送时会包含该号）
       * count		int	成功提交的号码个数
       * resultcode		string	发送请求提交的结果编码
       * resultmsg		string	发送请求提交的结果说明
       */
      /**
       * 入参样例：
       * {
       *   “uid”: ”guest”,
       *   “userpwd”: ”e10adc3949ba59abbe56e057f20f883e”,
       *   “mobile“: ”13800000001,18900000001”,
       *   “message”: ”【测试信息】您的验证码：22342”,
       *   ”ext“: ”111”
       * }
       *
       * 回执JSON样例
       * 成功样例：{"mid":"20170201230320","count":2,"resultcode":"0",”resultmsg”:”成功提交，待发送”}
       * 审核样例：{"mid":"20170201230320","count":2,"resultcode":"0",”resultmsg”:”成功提交，待审核”}
       * 失败样例：{"mid":"20170201230320","count":2,"resultcode":"1002",”resultmsg”:”账户或者密码错误”}
       */
      // 发送验证码
      const code = Math.random().toString().slice(-6);
      // 进行短信发送
      const result = await this.ctx.curl('http://sms.zh-ink.com/api/sms/send', {
          method: 'POST',
          dataType: 'json',
        contentType: 'json',
          data: {
            uid: 'gfxz',
            userpwd: '77b53dc6c9f7af52f67b3b24c6d988ae',
            mobile: phone,
            message: `【测试信息】您的验证码：${code}`,
          }
      })
      console.log('result',result)
      // 保存验证码
      await this.ctx.model.Code.create({
          phone,
          code,
          type: 1,
          expire_time: new Date(Date.now() + 1 * 60 * 1000),
      })
      return code;
    }
}

module.exports = RouterService;
